package cn.hncu.booksManagementSystem.user.dao.impl;

import java.util.ArrayList;
import java.util.Collection;

import cn.hncu.booksManagementSystem.common.enums.XxxIdEnum;
import cn.hncu.booksManagementSystem.user.dao.dao.UserDAO;
import cn.hncu.booksManagementSystem.user.vo.UserModel;
import cn.hncu.booksManagementSystem.user.vo.UserQueryModel;
import cn.hncu.booksManagementSystem.utils.FileIoUtil;
import cn.hncu.booksManagementSystem.utils.GeneratorXxxID_Util;

public class UserDAO_FileImpl implements UserDAO {
	// 数据源的路径+名称
	private final static String FILE_NAME = "./data/user.info";

	// 采用单例模式，实现内存中就一个 UserDAO_File 类的实例化对象
	private static UserDAO_FileImpl udf = null;

	private static Collection<UserModel> col = FileIoUtil.readFromDataBase(FILE_NAME);

	// 初始化一个超级管理员信息
	static {
		if (col.size()==0) {
			Collection<UserModel>cc = new ArrayList<UserModel>();
			UserModel user = new UserModel();
			user.setId(GeneratorXxxID_Util.getXxxId(XxxIdEnum.USER));
			user.setName("admin");
			user.setPwd("123");
			user.setType(1);
			cc.add(user);
			FileIoUtil.write2DataBase(cc, FILE_NAME);
		}
	}

	/**
	 * 通过工厂方式获取UserDAO_File对象，实现单例
	 * @return UserDAO_File的实例
	 */
	public synchronized static UserDAO_FileImpl getUserDAO_File() {
		if (udf == null) {
			udf = new UserDAO_FileImpl();
		}
		return udf;
	}

	// 私有化构造函数，保持单例
	private UserDAO_FileImpl() {
		col=getAll();
	}

	@Override
	public boolean add(UserModel user) {
		//如果被添加的对象为空直接返回null;
		if (user==null) {
			return false;
		}
		UserModel queryUser = getUserModelById(user.getId());
		if (queryUser != null) {// 如果找到了说明该用户已存在
			return false;
		}
		col.add(user);
		boolean boo = FileIoUtil.write2DataBase(col, FILE_NAME);
		if (boo) {
			// 能到这里说明已经成功添加，更新下一个user的Id
			GeneratorXxxID_Util.updateXxxId(XxxIdEnum.USER);
			return true;
		}
		return false;
	}

	@Override
	public boolean delete(UserModel user) {
		//如果删除的对象为空，则返回false;
		if (user==null) {
			return false;
		}
		boolean boo = col.remove(user);
		return boo && FileIoUtil.write2DataBase(col, FILE_NAME);
	}

	@Override
	public boolean update(UserModel user) {
		if (user==null) {
			return false;
		}
		ArrayList<UserModel> res = (ArrayList<UserModel>) col;
		boolean boo = false;
		for(int i = 0 ; i<res.size(); i++) {
			if (res.get(i).equals(user)) {
				res.set(i, user);
				boo = true;
				break;
			}
		}
		col = res;
		return boo && FileIoUtil.write2DataBase(col, FILE_NAME);
	}

	@Override
	public UserModel getUserModelById(String id) {
		if (id==null) {
			return null;
		}
		for (UserModel u : col) {
			if (u.getId().equals(id)) {
				return u;
			}
		}
		return null;
	}

	@Override
	public Collection<UserModel> getAll() {
		if (col.size() > 0) {
			return col;
		}
		return FileIoUtil.readFromDataBase(FILE_NAME);
	}

	@Override
	public Collection<UserModel> getUsersByCondition(UserQueryModel uqm) {
		//如果查询对象为null,则查询所有
		if (uqm==null) {
			return col;
		}
		Collection<UserModel> resCol = new ArrayList<UserModel>();
		for (UserModel u : col) {
			// 卫兵1查id
			// 判断是否是有效的查询条件
			if (uqm.getId() != null && uqm.getId().trim().length() > 0) {
				// 反逻辑
				if (!u.getId().equals(uqm.getId().trim())) {
					continue;
				}
			}
			// 卫兵2查姓名
			// 判断是否是有效的查询条件
			if (uqm.getName() != null && uqm.getName().length() > 0) {
				// 模糊查询
				if (!u.getName().contains(uqm.getName().trim())) {
					continue;
				}
			}
			// 卫兵3查类型
			// 判断是否是有效的查询条件
			if (uqm.getType() != 0) {
				if (u.getType() != uqm.getType()) {
					continue;
				}
			}
			resCol.add(u);
		}
		return resCol;
	}
}
